
/**
 * 位运算符：7个 -> & | ~ ^ >> << >>>无符号位左移/用0填充高位
 1.判断奇偶数   &1:0->偶数 1->奇数
 2.判断二进制位是1/0
 3.整数值交换	a^a->a
 4.不用判断语句求整数绝对值:取反再加一   int->32位 /long->64位
 */
public class BitOperation {

	/**
	 * 16进制表示的特殊二进制位
	 */
	private static final int M1 = 0x55555555; 		// 01010101010101010101010101010101
	private static final int M2 = 0x33333333; 		// 00110011001100110011001100110011
	private static final int M4 = 0x0f0f0f0f; 		// 00001111000011110000111100001111
	private static final int M8 = 0x00ff00ff; 		// 00000000111111110000000011111111

	public static void main(String[] args) {
		//	7:0111	8:1000
		int num1 = 7,num2 = 8,num3 = -3;

		//判断奇偶数   &1:0->偶数 1->奇数
		System.out.println(num1+"是："+((num1&1)==0?"偶数":"奇数"));
		System.out.println(num2+"是："+((num2&1)==1?"奇数":"偶数"));

		//判断二进制位是1/0
		System.out.println(num1+"二进制的第3位是"+(((num1&(1<<2))>>2)==0?"0":"1"));
		System.out.println(num1+"二进制的第4位是"+(((num1&(1<<3))>>3)==0?"0":"1"));

		System.out.println(num1+"二进制的第3位是"+(((num1>>2)&1)==0?"0":"1"));
		System.out.println(num1+"二进制的第4位是"+(((num1>>3)&1)==0?"0":"1"));

		//整数值交换	a^a->a
		num1 = num1^num2;
		num2 = num1^num2;
		num1 = num1^num2;
		System.out.println("num1:"+num1+"\tnum2:"+num2);

		//不用判断语句求整数绝对值:取反再加一   int->32位 /long->64位		0/-1		0/1
		System.out.println(num3+"取反再加一求绝对值："+((num3^(num3>>31))+(num3>>>31)));

		//汉明距离：指两个整数对应二进制位不同的位置的数目
		System.out.println("Integer.bitCount: "+hammingDistance1(num1,num2));
		System.out.println("汉明距离: "+hammingDistance2(num1,num2));

		System.out.println("===============*****===============");
		integerReverse(num1);

	}

	/**
	 * 位运算的反转
	 * @param num1
	 */
	private static void integerReverse(int num1) {
		System.out.println("num1: "+num1);
		//返回给定unsigned的字符串表示形式 - 由二进制参数表示的整数值
		System.out.println("Integer.toBinaryString(value): " + Integer.toBinaryString(num1));

		//反转位顺序 - 不会引发异常
		System.out.println("Integer.reverse(value): " + Integer.reverse(num1));
	}

	//内置位计数功能
	public static int hammingDistance1(int x, int y) {
		return Integer.bitCount(x ^ y);
	}

	//移位
	public static int hammingDistance2(int x, int y) {
		int xor = x ^ y;
		int distance = 0;
		while(xor != 0){
			if(xor%2 == 1)  distance++;
			xor = xor >> 1;
		}
		return distance;
	}
}
